נבין מהוא משתנה ואיך php שומרת לנו נתונים בזיכרון
משתנה הוא שם למשהו ששמור בזיכרון — מספר כלשהו, טקסט כלשהו שאנחנו יכולים להשתמש בהם במהלך התכנית כדי לשמור נתונים כלשהם לתווך הקצר.
בסוף המדריך נכרי סוגים שונים של משתנים, ההבדלים ביניהם, איך לגשת אליהם ועוד.
משתנים מבצעים עבורנו עבודה חשובה ביותר — שומרים נתונים בזיכרון. ועל עבודה טובה צריך לשלם. מהסיבה הזו, שמות משתנים ב-PHP מתחילים בסימן הדולר ולאחריו שם המשתנה. לדוגמא: $iVar
משתנה לא יכול להיות קיים בפני עצמו. הוא צריך את הערך שלו ופשוט לא יכול בלעדיו. לשים ערך כלשהו במשתנה אפשר באמצעות פעולה שנקראת השמה.
השמה נראית ככה: $var = something;
שם תקין של משתנה מורכב מאותיות, מספרים וקו תחתון (אבל לא יכול להתחיל ממספר). הנה כמה דוגמאות:
$var = 1; // נכון
$VAr = 1; // נכון
$_var3 = 1; // נכון
$3var = 1; // לא נכון. מתחיל ממספר a
$_____ = 1; // נכון a
$@-!%(_*) = 1; // לא נכון. רק ספרות, אותיות וקו תחתון
(במקרים מסוימים תראו בהערות של הקוד את האות a. מטרתה היא ליישר את התצוגה של קוד משמאל לימין באתר והיא לא קשורה לדוגמה, לקוד או לכל דבר אחר בפועל)$VAr = 1; // נכון
$_var3 = 1; // נכון
$3var = 1; // לא נכון. מתחיל ממספר a
$_____ = 1; // נכון a
$@-!%(_*) = 1; // לא נכון. רק ספרות, אותיות וקו תחתון
בדיוק כמו מקרר — משתנים שומרים נתונים.
יש מאכלים שונים שאפשר לשמור במקרר: שתיה, מאפים, מרקים, בשר, חלב
כך גם יש טיפוסים שונים של נתונים שאפשר לשמור במשתנה: מספרים, אותיות ועוד.
סוגי נתונים בסיסיים:
בוליאני: סוג מיוחד שיכול להכיל ערך של אמת או שקר (כן ולא). משמש בדרך כלל בביטויים.
הביטוי "2 גדול מ 1" הוא אמת (כן).
הביטוי "1 גדול מ 2" הוא שקר (לא).
ביטוי יכול להיות או אמת או שקר.
$bBool = true;
$bBool = False;
$bBool = False;
מספר: מספר שלם רגיל לחלוטין (123465). שימו לב: לא צריך גרשיים!
מספרים יכולים להיות חיוביים, שלילים או בבסיס ספירה שונים.
בסיס ספירה הוא סולם ספרות מסוים. בדרך כלל אנחנו עובדים עם בסיס ספירה 10, שבו אחרי שמגיעים למספר 10 כביכול עוברים שלב בסולם. יש בסיסי אחר מוכר, שהוא בסיס ה-2 (בינארי) שבו אחרי שמגיעים למספר שני עוברים סולם.
כלומר 0,1, 10,11, 100,101 ...
אין צורך להתמקד בזה יותר מדי בשלב הזה.
$iInt = 1234; // decimal number
$iInt = -123; // a negative number
$iInt = 0123; // מספר לפי בסיס שמונה (שווה ל83 לפי בסיס 10
$iInt = 0x23; // מספר לפי בסיס 16
$iInt = -123; // a negative number
$iInt = 0123; // מספר לפי בסיס שמונה (שווה ל83 לפי בסיס 10
$iInt = 0x23; // מספר לפי בסיס 16
בדרך כלל טווח המספרים הוא בין +2,147,483,647 ל −2,147,483,648
אני מניח שמסקרן אותכם לדעת מה יקרה, אם נחליט להכניס למשתנה מספר מחוץ לטווח. אני יזכיר לכם בסוף הפרק לנסות.
שבר עשרוני: מספר עם נקודה עשרונית.
המחשב מקצה לשברים מקום רב יותר בזיכרון, לכן כאן הטווח הרבה יותר רחב ממספרים רגילים. הדיוק הוא כ-14 ספרות לאחר הנקודה העשרונית.
$fFloat = 10.2;
$fFloat = 1.2e3; // 1.2 * 103 = 1.2 * 1000
$fFloat = 1.2e3; // 1.2 * 103 = 1.2 * 1000
מחרוזת: טקסט רגיל שתמיד חייבת להיות בגרש או גרשיים.
מבחינת php מחרוזת היא שורה של תווים (בייטים) וכל עוד לא נגמר לשרת הזיכרון — אין שום הגבלה על אורך מחרוזת מרבי.
מחרוזת ב-php אפשר להגדיר בשני צורות. מחרוזת בגרש יחידה 'string' ומחרוזת בגרשיים כפולים "string" ההבדל ביניהם הוא האופן שבו php נוהגת בתוכן המחרוזת. בתוך מחרוזת עם גרשיים כפולות php מציבה ערכים במקום משתנים, לאומת מחרוזות עם גרש אחת שבהן ערכי משתנים לא מוצבים.
אם נרצה להכניס את תו הגרש או הגרשיים לתוך המחרוזת עצמה — נצרתך לסמן למפענח באמצעות סלאש שהגרש הזו אינה מסמלת את סוף המחרוזת אלה היא חלק ממנה. פעולה זו נקראת הברחה ומאפשרת לגרש להיות חלק מהמחרוזת עצמה.
echo 'A simple string';
echo 'Arnold said Here I\'m'; // Escaping the '
echo 'You may put line break
and have multiple lines of text
in your string';
$sTest = 'php variable';
echo 'The value of $sTest would NOT get into the string';
// outputs: The value of $sTest would NOT get into the string
echo "The output of $sTest WILL be a part of the string";
// outputs: The output of php variable WILL be a part of the string
echo 'Arnold said Here I\'m'; // Escaping the '
echo 'You may put line break
and have multiple lines of text
in your string';
$sTest = 'php variable';
echo 'The value of $sTest would NOT get into the string';
// outputs: The value of $sTest would NOT get into the string
echo "The output of $sTest WILL be a part of the string";
// outputs: The output of php variable WILL be a part of the string
שימו לב שבמקרה עם שני הגרשיים במקום המשתנה קיבלנו בעצם את הערך שלו, לעומת המקרה עם הגרש היחידה, ששם שם המשתנה לא הוצב במחרוזת עצמה והסימן של הדולר נשאר כחלק מהמחרוזת.
כאשר php מפענחת משתנים בתוך מחרוזת בגרשיים כפולים, הוא מחפש את המשתנה עם השם התקין הארוך ביותר שהוא יכול למצוא. כלומר במידה ויש לנו שני משתנים: $a ו $abc הרי שבמחרוזת המפענח יחפש את המשתנה עם האורך הגדול יותר ויתעלם מהמשתנה הקצר יותר שהוא חלק משמו של המשתנה הארוך.
$beer = 'Heineken';
echo "He drank some $beer"; // עובד
echo "He drank some $beers"; // לא עובד, $beers הוא שם משתנה חוקי שלא קיים ונגרמת שגיאה.
echo "$beer's taste is great"; // עובד. הגרש לא יכולה להיות חלק משם המשתנה, לכן המפענח מזהה בוודאות מה הוא שם המשתנה האמיתי
echo "He drank some ${beer}s"; // אפשר גם ככה
echo "He drank some {$beer}s"; // או ככה וגם זה יעבוד
echo "He drank some $beer"; // עובד
echo "He drank some $beers"; // לא עובד, $beers הוא שם משתנה חוקי שלא קיים ונגרמת שגיאה.
echo "$beer's taste is great"; // עובד. הגרש לא יכולה להיות חלק משם המשתנה, לכן המפענח מזהה בוודאות מה הוא שם המשתנה האמיתי
echo "He drank some ${beer}s"; // אפשר גם ככה
echo "He drank some {$beer}s"; // או ככה וגם זה יעבוד
סוגי נתונים מורכבים
מערך: הוא מקרר המכיל מאכלים בסיסיים.
המערך הוא משתנה אחד שיכול להכיל הרבה ערכים.
$aArray = Array('cheese','milk');
בדוגמה הזו המקרר שלנו מכיל שני מוצרים מטיפוס מחרוזת (ולכן נמצאים בגרשיים).
בתכנות מספור האלמנטים תמיד מתחיל מאפס. האלמנט האפסי במערך הוא גבינה והאלמנט הראשון הוא החלב. עובדה זו יכולה לבלבל בהתחלה, אבל עם הזמן תתרגלו. אין מה לעשות.
$array = Array('cheese','milk'); // יוצרים מערך עם שני מחרוזות
echo $array[0]; // מדפיסים את המחרוזת במיקום האפס: ידפיס גבינה
$array[1] = 'ice-cream'; // משנים את המחרוזת במיקום האחד מחלב לגלידה
echo $array[1]; // ידפיס גלידה
echo $array[0]; // מדפיסים את המחרוזת במיקום האפס: ידפיס גבינה
$array[1] = 'ice-cream'; // משנים את המחרוזת במיקום האחד מחלב לגלידה
echo $array[1]; // ידפיס גלידה
מערכים אסוציאטיביים:
באותו אופן יכולנו להכניס לתוך מערך גם משתנים אחרים $arr = Array($a , $b);
לכל משתנה יש שם וערך, מה שאומר שלמערך אנחנו יכולים להכניס גם זוגות נתונים מסוג שם-ערך. מערך מסוג זה נקרא מערך אסוציאטיבי, בזכות האסוציאציה (קישור) בין שם לערך והשמות במערך כזה נקראים מפתחות.
$arr = Array('key'=>'val' , 'key2'=>'val2');
במערך הזה אין אלמנט אפסי או ראשון, אבל יש אלמנט key ו-key2.
$arr = Array('key'=>'val' , 'key2'=>'val2'); // יוצרים מערך עם שני מחרוזות
echo $arr['key']; // ניגשים לאלמנט עם המפתח key. ידפיס: val
echo $arr[0]; // ניגשים לאלמנט עם האינדקס האפסי ומקבלים שגיאה. אין אלמנט כזה
$arr['key2'] = 'ice-cream'; // משנים את האלמנט עם המפתח key2 לגלידה
echo $arr['key2']; // מדפיסים אותו. ידפיס: גלידה
echo $arr['key']; // ניגשים לאלמנט עם המפתח key. ידפיס: val
echo $arr[0]; // ניגשים לאלמנט עם האינדקס האפסי ומקבלים שגיאה. אין אלמנט כזה
$arr['key2'] = 'ice-cream'; // משנים את האלמנט עם המפתח key2 לגלידה
echo $arr['key2']; // מדפיסים אותו. ידפיס: גלידה
מערך רב מימדי:
מערך יכול להכיל כל סוג נתונים וגם מערך אחר בין היתר.
מערך שמכיל מערך נקרא מערך דו-מימדי.
$ARRAY = Array // numeric keys 0,1,2
(
Array('a',123, true) , // אינדקסים מספריים: 0,1
Array('key'=>'val' , 'key2'=>'val2') , // מערך אסוציאטיבי עם המפתחות: key & key2
Array('key3'=>'val3', 'chips') // מערך אסוציאטיבי עם המפתחות: key3 & 0
);
// ניגשים לאיברים במערך רב מימדי:
echo $ARRAY[2]['key3'];
/* קודם כל ניגשים לאיבר עם האינדקס 2 בתוך $ARRAY, שהוא:
[ Array('key3'=>'val3', 'chips') ]
ובתוכו ניגשים לאלמנט עם המפתח key3
*/
// עוד דוגמאות למערך רב מימדי
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
echo $arr["somearray"][6]; // 5
echo $arr["somearray"][13]; // 9
echo $arr["somearray"]["a"]; // 42
(
Array('a',123, true) , // אינדקסים מספריים: 0,1
Array('key'=>'val' , 'key2'=>'val2') , // מערך אסוציאטיבי עם המפתחות: key & key2
Array('key3'=>'val3', 'chips') // מערך אסוציאטיבי עם המפתחות: key3 & 0
);
// ניגשים לאיברים במערך רב מימדי:
echo $ARRAY[2]['key3'];
/* קודם כל ניגשים לאיבר עם האינדקס 2 בתוך $ARRAY, שהוא:
[ Array('key3'=>'val3', 'chips') ]
ובתוכו ניגשים לאלמנט עם המפתח key3
*/
// עוד דוגמאות למערך רב מימדי
$arr = array("somearray" => array(6 => 5, 13 => 9, "a" => 42));
echo $arr["somearray"][6]; // 5
echo $arr["somearray"][13]; // 9
echo $arr["somearray"]["a"]; // 42
מילוי מערך:
תכולת המערך יכולה להיות מוגדרת מראש, כפי שראינו מקודם
$arr = Array(1,2,3);
אינדקסים: 0,1,2או תכולת המערך יכולה להשתנות בזמן ריצה ואלמנטים חדשים יכולים להתווסף:
$arr[3] = 5;
נוצר אלמנט חדש עם האינדקס 3 ומיד מוצב בו הערך המספרי 5.כמו כן, ניתן ליצור אלמנט במערך ולהשאיר את חישוב האינדקסים ל- עצמה.
$arr[] = 10;
באופן הזה php יחשב את האינדקס המספרי הנוכחי ויגדיל אותו באחד לבד.אחרי שהוספנו את 5 למערך, האינדקס המספרי הגדול ביותר נהיה 3.
בהוספת ה10 למערך, php יחשב את האינדקס הנוחכי (3)
יוסיף לו אחד (4) וייצור אלמנט עם האינדקס הזה.
נסו לנחש מה יהיה האינדקס של הבננה בשני המקרים הבאים:
$arr = Array('key3'=>'val3', 'Chips') ;// Indexes: key3 & 0
$arr[] = 'Banana'; // Try guessing what would Banana's index be
$arr = Array('key3' => 'val3', 'tasty' => 'Chips') ;
$arr[] = 'Banana'; // Try guessing Banana's index now
$arr[] = 'Banana'; // Try guessing what would Banana's index be
$arr = Array('key3' => 'val3', 'tasty' => 'Chips') ;
$arr[] = 'Banana'; // Try guessing Banana's index now
תשובה:
במקרה הראשון האינדקס המספרי הגדול ביותר הוא 0.
נוסיף לו אחד ונקבל את האינדקס 1 עבור בננה.
במקרה השני לא קיים אינדקס מספרי, לכן ייווצר אינדקס מספרי חדש. המספור בו יתחיל מאפס, לכן האינדקס של בננה יהיה אפסי.
סוגי נתונים מורכבים ממש
משאב (Resource):
משאב הוא מצביע, קישור למשהו חיצוני.
תארו לעצמכם מוסך גדול עם עשרות חניות. מפינת הרחוב בחריקה מטורפת יוצאת לה פררי אדומה יפהפייה, עוצרת לה בחניה מספר חמש של המוסך ויוסי, הבעלים של הפררי יוצא וצועק לעבר המוסכניק: מלא לי 10 ליטר שמן במכונית. החניתי אותו בחניה מספר חמש ומראה לכיוונה עם האגודל.
העובד שלנו קיבל מהנהד שני דברים.
א. מספר (כמות ליטרי השמן. שימו לב: הוא לא קיבל את השמן עצמו, אלה מספר)
ב. מזהה ייחודי (מצביע) של מיקום המכונית בחניית המוסך.
הוא לא קיבל את המכונית עצמה, אלה קישור למיקום בו נמצאת המכונית.
קישור זה למשהו חיצוני נקרא משאב.
Null:
כדי להבין מה הוא Null צריך להבין איך שומרת php משתנים בזיכרון.
זיכרון המחשב מורכב ממספר גדול של תאים קטנים — חניות.
בתאים אלה, נכתבים כל הנתונים.
גישה לתא מסוים מתבצעת באמצעות מזהה ייחודי של מיקומו בזיכרון (לדוגמה תא מספר חמש).
למעשה, php שומרת קשר בין שם משתנה למזהה תא בזיכרון, בו ערך המשתנה שמור.
כלומר המשתנה $name שמור בתא #5 והמשתנה $age שמור בתא #6.
אנחנו בתוכנה עובדים עם שם של משתנה ו-php עושה את התרגום למספר תא המתאים מאחורי הכלאים.
כאשר אנו מקצים ערך בפעם הראשונה למשתנה כלשהו, php בוחרת תא בזיכרון, מכניסה לשם את הערך שלנו ומקשרת אצלה בין שם המשתנה למזהה של התא בזכרון.
כאשר למשתנה כלשהו מיוחס תא כלשהו בזכרון - אפשר לומר שהמשתנה מוגדר. משתנה ריק אומר שהתא של המשתנה מכיל את המספר אפס, מחרוזת בלי תווים או לא מכיל דבר בכלל.
הערך null מפרק את הקישור בין שם המשתנה לבין התא שבו נמצא הערך שלו. באופן הזה המשתנה לא מצביע לשום מקום ולא מיוחס לשום תא בזיכרון. המשתה הזה נחשב לא מוגדר.
בעצם null הוא שם משתנה שקיים ללא התאמה לתא כלשהו בזיכרון.
להפוך משתנה ל null אפשר עם הפקודה הבאה: $a = null;
שימו לב, המילה null לא נמצאת בגרשיים, כי זו אינה מחרוזת.
שאלות לסיכום:
1. מאיזה טיפוס המשתנה a בקוד הבא:
$a = '22';
א. מחרוזת כי הוא נמצא בגרשיים
ב. מספר, כי 22 זה מספר
ג. מערך כי היום יום ראשון
2. מה יותר גדול, а או b
$a = '46'; $b = '39';
א. שני המשתנים הם מחרוזות שאי אפשר להשוות
ב. המשתנה a גדול יותר כי הוא 46
ג. b גדול יותר כי הוא האות השניה ב-abc
3. נסו להציב את הערך 214748364900000000000 במשתנה. מה קרה?
א. הוא הפך להיות מסוג שבר (double) כי המחשב מקצה לו יותר מקום בזיכרון
ב. קיבלתי שגיאה
ג. לא הצלחתי להציב את זה במשתנה
4. נתונים שני משתנים. החליפו בין הערכים שלהם בזמן הריצה של הסקריפט.
$a = 'cheese'; $b = 'milk';
9. צרו מערך עם אלמנט אחד.
הוסיפו לשם עוד אלמנט.
הוסיפו אלמנט שלישי, שהוא מערך אסוציאטיבי המכיל אלמנט אחד.
הוסיפו למערך האסוציאטיבי הזה אלמנט עם האינדקס cool
תגובות לכתבה:
1.א
2.ב (אפשר להשוות בין מחרוזות אם אני לא טועה, במקרה כזה השרת קודם משווה בין האותיות הראשונות, ולכן a יותר גדול משום שהערך התווי של 4 גדול מהערך התווי של 3)
3.ג (נבדק בדף "ביצוע קוד" שלכם)
4.
$a = 'cheese';
$b = 'milk';
$temp = $a;
$a = $b;
$b = $temp;
5.
$arr[] = 1;
$arr[] = 2;
$arr[] = Array(3 => 3);
$arr[2][] = Array('cool' => 4);
תודה על המאמר, חידשת לי מספר דברים :)
2. לא ממש. השרת אמנם הופך את המחרוזות למספרים, אבל בהתאם לטבלת ascii
3.
הדף שלנו קצת מרמה :)
צריך להציב שם מספר הרבה יותר גדול, כמו
2147483649000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;
5. המדריך מתחיל בזה ששמות משתנים כאלה הם לא חוקיים :)
חוץ מזה - כל הכבוד. המשך כך :)